package com.ikun.dao;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.ikun.entity.Attendances;

/**
 * 考勤表(Attendances)表数据库访问层
 *
 * @author Li
 * @since 2025-03-26 10:52:34
 */
@Mapper
public interface AttendancesDao {

    /**
     * 通过ID查询单条数据
     *
     * @param attendanceId 主键
     * @return 实例对象
     */
    Attendances queryById(@Param("attendanceId") Integer attendanceId);

    /**
     * 统计总行数
     *
     * @param attendances 查询条件
     * @return 总行数
     */
    long count(Attendances attendances);

    /**
     * 新增数据
     *
     * @param attendances 实例对象
     * @return 影响行数
     */
    int insert(Attendances attendances);

    String getStaffNameById(@Param("staffId") Integer staffId);

    int updateClockOut(@Param("attendanceId") Integer attendanceId, @Param("clockOut") java.sql.Timestamp clockOut,
        @Param("status") Integer status);

    Integer getLatestAttendanceId(@Param("staffId") Integer staffId, @Param("recordDate") LocalDate recordDate);

    int insertStatus(@Param("attendanceId") Integer attendanceId, @Param("StaffId") Integer StaffId,
        @Param("recordDate") LocalDate recordDate, @Param("status") Integer status);

    List<Attendances> getAttendanceRecords(Map<String, Object> params);

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     *
     * @param entities List<Attendances> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<Attendances> entities);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param entities List<Attendances> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<Attendances> entities);

    /**
     * 修改数据
     *
     * @param attendances 实例对象
     * @return 影响行数
     */
    int update(Attendances attendances);

    /**
     * 通过主键删除数据
     *
     * @param attendanceId 主键
     * @return 影响行数
     */
    int deleteById(@Param("attendanceId") Integer attendanceId);

    // 计算考勤天数
    int calculateAttendanceDays(@Param("formattedYearMonth") String formattedYearMonth,
        @Param("manageId") String manageId);

    List<Attendances> findAllStuffAttendances(@Param("datePart") String datePart, @Param("namePart") String namePart);

    // 通过对应的ID去查询管家/员工的考勤信息
    List<Attendances> findAttendancesByMangerId(@Param("userId") Integer userId);

    List<Attendances> getAllAttendance(@Param("staffId") Integer staffId);

    List<Attendances> findAttendancesByStaffIdAndRecordDate(@Param("staffId") Integer staffId,
        @Param("recordDate") String recordDate);

    List<Attendances> allAttendances(@Param("recordDate") String recordDate, @Param("startTime") String startTime,
        @Param("endTime") String endTime);
}
